﻿#pragma once
//#define _DEBUG
#include<stddef.h>

#define _CRT_SECURE_NO_WARNINGS//可以不使用_s版本函数

#if (_MANAGED == 1) || (_M_CEE == 1) //托管支持
//表示有公共语言运行时支持
#define _CLR 1
#include "gcroot.h"
#endif

#if _WIN32 == 1
#ifndef _WINDOWS
//在Windows环境中
#define _WINDOWS 1
#endif
#endif
#if __ANDROID__ ==1
#ifndef _ANDROID
//在android环境中
#define _ANDROID 1
#endif
#endif
#if __linux__ == 1
#ifndef _LINUX
//在linux环境中
#define _LINUX 1
#endif
#endif

//编译器相关
//VC
/*vc++ 5.0 　　　　 VS 5.0               1100
vc++ 6.0              VS 6.0              1200
vc++7.0               VS 2003            1310
vc++ 8.0()           VS 2005           1400
vc++9.0()            VS 2008           1500
VC++10.0			VS 2010				1600
VC++11.0			VS 2012				1700
VC++12.0			VS 2013				1800 */

#ifdef _MSC_VER
#define _VC _MSC_VER
#endif
//g++
#ifdef __GNUC__
#define _GCC __GNUC__
#endif




#ifdef _WIN64
#ifndef _X64
//64位环境
#define _X64 1
#endif
#endif

#ifdef __x86_64__ 
#ifndef _X64
//64位环境
#define _X64 1
#endif
#endif

//VS版本特性
#if _MSC_VER>=1600
#define SUPPORT_RIGHT_VALUE_REFERENCE 1//支持右值引用
#else
#ifndef _CLR
//#define nullptr 0
#endif
#endif
#if _MSC_VER>1600
#define SUPPORT_DECLTYPE 1//支持decltype类型推断
#endif

#if _MSC_VER>1700
#define SUPPORT_VARIADIC_TEMPLATES 1//支持可变模版参数
#endif
/*
MS VC++ 10.0 _MSC_VER = 1600（VS2010）
MS VC++ 9.0 _MSC_VER = 1500
MS VC++ 8.0 _MSC_VER = 1400
MS VC++ 7.1 _MSC_VER = 1310
MS VC++ 7.0 _MSC_VER = 1300
MS VC++ 6.0 _MSC_VER = 1200
MS VC++ 5.0 _MSC_VER = 1100
*/

#ifdef _GCC
#define SUPPORT_RIGHT_VALUE_REFERENCE 1//右值引用
#define SUPPORT_VARIADIC_TEMPLATES 1//启用可变模版参数
#define UPPORT_DECLTYPE 1
#endif


#ifdef _WINDOWS
#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_//这里的windows.h排除WinSock旧版本
#else
#define ALREADY_WINSOCKAPI_
#endif
#include <windows.h>
#ifndef ALREADY_WINSOCKAPI_
#undef _WINSOCKAPI_
#endif
#undef ALREADY_WINSOCKAPI_
#endif


//调用约定,CDECL,FASTCALL,STDCALL
#if _VC!=0
#ifndef CDECL
#define CDECL __cdecl
#endif
#ifndef FASTCALL
#define FASTCALL __fastcall
#endif
#ifndef STDCALL
#define STDCALL __stdcall
#endif
#ifndef CLRCALL
#define CLRCALL __clrcall
#endif
#elif _GCC!=0
#ifndef CDECL
#define CDECL __attribute__((cdecl))
#endif
#ifndef FASTCALL
#define FASTCALL __attribute__((fastcall))
#endif
#ifndef STDCALL
#define STDCALL __attribute__((stdcall))
#endif
#ifndef _cdecl
#define _cdecl __attribute__((cdecl))
#endif
#ifndef _fastcall
#define _fastcall __attribute__((fastcall))
#endif
#ifndef _stdcall
#define _stdcall __attribute__((stdcall))
#endif
#ifndef __cdecl
#define __cdecl __attribute__((cdecl))
#endif
#ifndef __fastcall
#define __fastcall __attribute__((fastcall))
#endif
#ifndef __stdcall
#define __stdcall __attribute__((stdcall))
#endif
#endif

#ifdef _ANDROID
#define CANUSECDECL
#undef CDECL
#define CDECL
#else
#ifndef _CLR
#define CANUSEFASTCALL
#endif
#if (_X64!=1)
#define CANUSECDECL
#define CANUSESTDCALL
#else//始终使用cdecl
#define CANUSECDECL
#undef CANUSEFASTCALL
#endif
#endif
